/*
 * Copyright 2012 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.springsource.greenhouse.utils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLEncoder;
public class GeoLocation {
	
	private final static String ENCODING = "UTF-8";
	// This is a Google API Key, generated by a member of the UA Spring team, can be changed if needed
	private final static String KEY = "ABQIAAAAtibbxuabc4IbMMd3Lz6YKxT8h4OmK3OACxx2GTyIwybqxjarwRRNysxHsfcnzRtf9nk6CkJc3fb05Q";

	private String lon, lat;
	
	private GeoLocation (String lat, String lon) {
		this.lon = lon;
		this.lat = lat;
	}

	public String toString () { return "Lat: "+lat+", Lon: "+lon; }
	
	public Double toLongitude () { return new Double(lon); }
	
	public Double toLatitude () { return new Double(lat); }

	public static GeoLocation getGeoLocation (String address) throws IOException {
		BufferedReader in = new BufferedReader (new InputStreamReader (new URL ("http://maps.google.com/maps/geo?q="+URLEncoder.encode (address, ENCODING)+"&output=csv&key="+KEY).openStream ()));
		String line;
		GeoLocation location = null;
		int statusCode = -1;
		while ((line = in.readLine ()) != null) {
			// Format: 200,6,42.730070,-73.690570
			statusCode = Integer.parseInt (line.substring (0, 3));
			if (statusCode == 200)
				location = new GeoLocation (
						line.substring ("200,6,".length (), line.indexOf (',', "200,6,".length ())),
						line.substring (line.indexOf (',', "200,6,".length ())+1, line.length ())
						);
		}
		if (location == null) {
			switch (statusCode) {
			case 400: throw new IOException ("Bad Request");
			case 500: throw new IOException ("Unknown error from Google Encoder");
			case 601: throw new IOException ("Missing query");
			case 602: return null;
			case 603: throw new IOException ("Legal problem");
			case 604: throw new IOException ("No route");
			case 610: throw new IOException ("Bad key");
			case 620: throw new IOException ("Too many queries");
			}
		}
		return location;
	}
}
